#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N=2503;
int n,m,k,kx,ky,sx,sy,tim;
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
vector<bool>vis[N],used[N];
vector<int>dis[N];
struct Nod{int x,y;};
queue<Nod>q;
bool In(int x,int y){return 0<x&&x<=n&&0<y&&y<=m;}
void Sol0()
{
	queue<Nod>qq=q;
	while(qq.size())
	{
		Nod t=qq.front();qq.pop();
		for(int i=0;i<4;i++)
		{
			int tx=t.x+dx[i],ty=t.y+dy[i];
			if(In(tx,ty)&&vis[tx][ty]&&!used[tx][ty])
			    qq.push({tx,ty}),q.push({tx,ty}),used[tx][ty]=1,dis[tx][ty]=tim;
		}
	}
	if(used[sx][sy]){cout<<tim;exit(0);}
	tim++;
}
void Sol(int op)
{
	queue<Nod>qq=q,add;
	while(qq.size())
	{
		Nod t=qq.front();qq.pop();
		dis[t.x][t.y]=0;
	}
	qq=q;
	while(qq.size())
	{
		Nod t=qq.front();qq.pop();
		if(dis[t.x][t.y]==k-1)continue;
		for(int i=0+op*2;i<=1+op*2;i++)
		{
			int tx=t.x+dx[i],ty=t.y+dy[i];
			if(In(tx,ty)&&!used[tx][ty]&&dis[tx][ty]>dis[t.x][t.y]+1)
			    used[tx][ty]=1,qq.push({tx,ty}),add.push({tx,ty}),dis[tx][ty]=dis[t.x][t.y]+1;
		}
	}
	while(add.size())q.push(add.front()),add.pop();
}
void Sol1()
{
	queue<Nod>qq=q;
	while(qq.size())
	{
		Nod t=qq.front();qq.pop();
		for(int i=0;i<4;i++)
		{
			int tx=t.x+dx[i],ty=t.y+dy[i];
			if(In(tx,ty)&&!used[tx][ty])used[tx][ty]=1,q.push({tx,ty});
		}
	}
	if(used[sx][sy]){cout<<tim;exit(0);}
}
int main()
{
	freopen("stamp.in","r",stdin);
	freopen("stamp.out","w",stdout);
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); 
	cin>>n>>m>>k>>kx>>ky>>sx>>sy;char ch;
	for(int i=0;i<=n+1;i++)vis[i].resize(m+2),used[i].resize(m+2);
	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>ch,vis[i][j]=ch=='.';
	for(int i=0;i<=n+1;i++)dis[i].resize(m+2);
	for(int i=0;i<=n+1;i++)for(int j=0;j<=m+1;j++)dis[i][j]=1e9;
	q.push({kx,ky});used[kx][ky]=1;dis[kx][ky]=0; 
	while(1)
	{
		int sz=q.size();
		Sol0();Sol(0);Sol(1);Sol1();
		while(sz--)q.pop();
	}
}
